/*
 * Game.h
 *
 *  Created on: 29/11/2009
 *      Author: kill
 */
#pragma once

#include <gl/glew.h>
#include <windows.h>
#include <gl/freeglut.h>
#include <hash_map>
#include <fmod.hpp>


#include "EngineLogin.h"
#include "EventManager.h"
#include "LogginListener.h"
#include "ResourceManager.h"
#include "SceneManager.h"
#include "Actor.h"
#include "Camara.h"
#include "CorutineManager.h"
#include "TransitionManager.h"
#include "FrameRate.h"

extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
	}

#define TIEMPO_TRANSCURRIDO g->gameTime
#define G_EVENTOS g->getEventos()
#define G_RECURSOS g->getRecursos()
#define G_TRANSICIONES g->getTransitionManager()
#define G_FPS g->getFPS()
#define G_RUTINAS g->getRutinas()


//#include <ftgl/ftgl.h>


//===============

class Game {
private:
	int altoPantalla, anchoPantalla;
	long loops;
	bool teclas[256];	

	//FTGLTextureFont *fuente;
	EngineLogin *log;
	FrameRate *fps;	
	EventManager *eventos;
	SceneManager *pilaEscenas;
	ResourceManager *recursos;
	CorutineManager *rutinas;
	Camara *camara;
	TransitionManager *trmanager;
	FMOD::System *audioSystem;

	lua_State* L;

	hash_map<ID,Actor*> actores;
	ID ultimaID;

public:
	Game(int anchoPantalla,int altoPantalla);

	/** FUNCIONES DE PROPOSITO GENERAL **/
	void cerrar(void);
	void addActor(Actor *actor);
	Actor *getActor(ID idActor){return actores[idActor];};
	ID getNewID(){++ultimaID;return ultimaID;};
	void alertaError(string &mensaje){MessageBox(NULL, (LPCTSTR)mensaje.c_str(), NULL, MB_ICONERROR);cerrar();}
	void removeActor(ID idActor){actores.erase(idActor);}

	/** getters **/
	bool *getTeclas(){return teclas;}
	TransitionManager *getTransitionManager(){return trmanager;}
	lua_State* getLua(){return L;}
	CorutineManager *getRutinas(){return rutinas;}
	FMOD::System *getAudio(){return audioSystem;}
	Camara *getCamara(){return camara;}
	EventManager *getEventos()  { return eventos; }
	FrameRate* getFPS()  { return fps; }
	EngineLogin* getLog()  { return log; }
	ResourceManager* getRecursos(){return recursos;}
	hash_map<ID,Actor*> *getActors(){return &actores;}
	long getLoops(){return loops;}
	int getAnchoPantalla(){return anchoPantalla;}
	int getAltoPantalla(){return altoPantalla;}
	//FTGLTextureFont *getFuente(){return fuente;}

	/** FUNCIONES PARA GLUT **/
	void loop(void);
	void raton(int x, int y);
	void teclado(unsigned char key, int x, int y, bool keydown);
	void flechas(int a_keys, int x, int y);
	void render(void);
	void oglInit(void);
	void update(float tiempoTranscurrido);
	void reshape(int w, int h);
	void botonRaton(int boton, int estado, int x, int y);
	~Game();

public:
	float r;
	float g;
	float b;

	float gameTime;
};
//esta clase maneja la velocidad del sistema.

extern Game *g;

